package org.eoti.ai.genetic.ga;

import java.util.concurrent.ConcurrentHashMap;

/**
 * The MIT License
 * <p/>
 * Copyright (c) 2009 Malachi de AElfweald (malachid@gmail.com)
 * <p/>
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * <p/>
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
 * Software.
 * <p/>
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

/**
 * CHROMOSOME: Set of GENEs to provide a possible solution to a problem
 *
 * Humans have 46 CHROMOSOMES. Two of them are the 'X' and 'Y' chromosomes, which
 * determine sex.
 *
 * Most GA only utilize one chromosome, and thus break the distinction between the
 * chromosome and the genotype, as they are usually only trying to solve one specific
 * problem. Instead of assuming this for whomever might use the API, we are leaving it
 * open-ended so that a sophisticated AI could have a different chromosome for each
 * problem set it tries to accomplish (ie: building, hunting, gathering, fighting)
 *
 * Different kinds of organisms have different numbers of chromosomes. Humans have 23 pairs of
 * chromosomes, 46 in all: 44 autosomes and two sex chromosomes. Each parent contributes one
 * chromosome to each pair, so children get half of their chromosomes from their mothers and
 * half from their fathers.
 * http://www.genome.gov/glossary.cfm?key=chromosome
 */
public class Chromosome<GENE>
{
	protected ConcurrentHashMap<Integer,GENE> genes;
	protected GENE defaultValue;
	protected String name;

	public Chromosome(String name, GENE defaultValue)
	{
		this.name = name;
		genes = new ConcurrentHashMap<Integer,GENE>();
		this.defaultValue = defaultValue;
	}

	public String getName(){return name;}

	public GENE get(int position)
	{
		GENE retVal = genes.get(position);
		if(retVal == null)
			retVal = defaultValue;

		return retVal;
	}

	public void set(int position, GENE gene)
	{
		genes.put(position, gene);
	}

	public Chromosome<GENE> copy(String newName)
	{
		Chromosome<GENE> copy = new Chromosome<GENE>(newName, defaultValue);
		for(Integer position : genes.keySet())
			copy.genes.put(position, genes.get(position));

		return copy;
	}
}
